package main

import (
	"context"
	"log"
	"os"
	"os/signal"
	"syscall"
	"time"

	"image_demo/internal/api"
	"image_demo/internal/config"
	"image_demo/internal/constants"
	"image_demo/internal/utils"
	"image_demo/internal/video"
	"image_demo/internal/worker"
)

func main() {
	utils.InitRandom()

	// 加载配置
	cfg, err := config.LoadConfig("config.yaml")
	if err != nil {
		log.Printf("加载配置失败: %v", err)
		os.Exit(1)
	}

	imageOutputDir := cfg.Output.ImageDir
	videoOutputDir := cfg.Output.VideoDir

	// 创建图片输出目录
	if err := os.MkdirAll(imageOutputDir, constants.DirPermission); err != nil {
		log.Printf("创建图片输出目录失败: %v", err)
		os.Exit(1)
	}

	// 创建视频输出目录
	if err := os.MkdirAll(videoOutputDir, constants.DirPermission); err != nil {
		log.Printf("创建视频输出目录失败: %v", err)
		os.Exit(1)
	}

	// 创建context用于优雅关闭
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

	// 创建统一的worker pool
	workerPool := worker.NewPoolWithConfig(constants.DefaultWorkerCount, cfg)
	workerPool.Start(ctx)

	// 信号处理
	sigChan := make(chan os.Signal, 1)
	signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM)

	// 优雅关闭goroutine
	go func() {
		sig := <-sigChan
		log.Printf("接收到信号: %v，开始优雅关闭...", sig)
		cancel()

		// 等待所有worker完成或超时
		done := make(chan struct{})
		go func() {
			workerPool.Stop()
			close(done)
		}()

		select {
		case <-done:
			log.Println("所有worker已完成，程序退出")
		case <-time.After(constants.GracefulShutdownTime):
			log.Println("等待超时，强制退出")
		}
		os.Exit(0)
	}()

	ticker := time.NewTicker(constants.TaskInterval)
	defer ticker.Stop()

	log.Println("开始定时任务，每隔10秒随机调用图片和视频API接口...")

	for {
		select {
		case <-ticker.C:
			log.Printf("\n=== 开始新一轮调用 [%s] ===", time.Now().Format("2006-01-02 15:04:05"))

			// 随机选择图片API接口
			selectedImageAPIs := api.SelectRandomAPIs(constants.DefaultAPICount)
			for _, apiURL := range selectedImageAPIs {
				// 创建图片任务
				task := worker.Task{
					APIURL:    apiURL,
					OutputDir: imageOutputDir,
					Type:      worker.TaskTypeImage,
				}

				// 提交任务到统一的worker pool
				if !workerPool.Submit(ctx, task) {
					log.Println("图片任务提交失败，程序可能正在关闭")
					return
				}
			}

			// 随机选择视频API接口
			selectedVideoAPIs := video.SelectRandomVideoAPIs(1) // 每次只调用一个视频API
			for _, apiURL := range selectedVideoAPIs {
				// 创建视频任务
				task := worker.Task{
					APIURL:    apiURL,
					OutputDir: videoOutputDir,
					Type:      worker.TaskTypeVideo,
				}

				// 提交任务到统一的worker pool
				if !workerPool.Submit(ctx, task) {
					log.Println("视频任务提交失败，程序可能正在关闭")
					return
				}
			}

			log.Printf("=== 本轮调用提交完成 ===")

		case <-ctx.Done():
			log.Println("程序正在关闭，停止定时任务")
			return
		}
	}
}
